Skip to content

feat(share): add P2P encrypted file sharing - #117

Merged
YueMiyuki merged 3 commits into
masterfrom
next-dev
Jun 28, 2026
Merged

feat(share): add P2P encrypted file sharing#117
YueMiyuki merged 3 commits into
masterfrom
next-dev

Conversation

@YueMiyuki

@YueMiyuki YueMiyuki commented Jun 28, 2026

Copy link
Copy Markdown
Owner

Summary by cubic

Integrates the Trellis v0.6.5 local workflow system with tasks/specs, session journaling, multi‑agent channels, and bundled skills. Tightens CI with cached Gradle/Rust (pinned actions) and streamlines Android debug builds with auto‑signing.

  • New Features

    • Added .trellis/ runtime: config, scripts (get_context.py, task.py, add_session.py), hooks, session journal/workspace memory, safe git staging; versioned via .trellis/.version, tracked by .trellis/.template-hashes.json, and ignored via .trellis/.gitignore.
    • Introduced workflow docs and tasks: .trellis/workflow.md, bootstrap task, and .agents/workflows/{start,continue,finish-work}.md.
    • Bundled skills: brainstorm/before‑dev, spec bootstrap/update, session insight (trellis mem), deep bug analysis, and channel runtime docs (command reference, workers, forum channels, progress debugging); plus Trellis meta customization guides.
    • Added local channel agents: .trellis/agents/implement.md and .trellis/agents/check.md.
    • Scaffolded project specs: frontend guidelines and thinking guides to reduce duplication and cross‑layer bugs.
    • DX/CI: release workflow caches via gradle/actions/setup-gradle and Swatinem/rust-cache (actions pinned); Android scripts add android:sign:debug and android:build:debug:unsigned and auto‑sign in android:build:debug; bumped biome schema; added AGENTS.md.
  • Migration

    • Initialize developer identity once: python3 ./.trellis/scripts/init_developer.py <name>.
    • Start a session and load context: python3 ./.trellis/scripts/get_context.py (or use the Start Session workflow in .agents/workflows/start.md).
    • Optional: enable Linear sync by creating .trellis/hooks.local.json and installing/configuring linearis; the hook is in .trellis/scripts/hooks/linear_sync.py.

Written for commit d0c0837. Summary will update on new commits.

Review in cubic

@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

This PR adds a P2P encrypted file-sharing feature using iroh/iroh-blobs (new risuko-share Rust crate, Tauri commands, Vue Share page, barcode scanner, Android NDK/JNI plumbing, deep-link routing), improves the Android build pipeline (Gradle tuning, sccache, debug signing, CI caching), applies idiomatic Rust refactors in existing crates, and bootstraps a complete Trellis v0.6.5 AI workflow system (Python scripts, agent cards, bundled skills, spec templates, and workspace initialization).

Changes

P2P File Sharing Feature

Layer / File(s) Summary
risuko-share crate: data model and ShareManager
src-tauri/risuko-share/Cargo.toml, src-tauri/risuko-share/src/lib.rs, src-tauri/Cargo.toml
New risuko-share crate defines FileMeta, PathKind, ShareEvent, ShareEnvelope, and ShareManager with start_send, start_receive, and cancel; includes progress tracking, connection-path monitoring, path sanitization, and output deduplication.
Android NDK, content URI staging, barcode scanner
src-tauri/src/commands/android_intent.rs, src-tauri/src/commands/file_cmds.rs, src-tauri/src/commands/mod.rs, src-tauri/src/commands/share_cmds.rs, src-tauri/src/lib.rs, src-tauri/capabilities/default.json, src-tauri/capabilities/mobile.json
Adds ANDROID_APP global, NDK_CONTEXT_READY latch, ensure_ndk_context, and stage_share_path for content:// URI staging via JNI; registers tauri-plugin-barcode-scanner on Android/iOS; wires ShareState and event relay to frontend; adds dialog:allow-save capability.
Share Vue page, router, and navigation
src/renderer/components/Share/Index.vue, src/renderer/router/index.ts, src/renderer/components/Aside/Index.vue, src/renderer/components/Main.vue, src/renderer/components/Native/SelectDirectory.vue, src/renderer/components/Preference/Sync.vue, src/renderer/pages/index/main.ts, package.json
Adds full Share page (send/receive tabs, QR code, device code, staged file list, transfer status); wires /share route; adds Share2 nav items; handles risuko://share/ deep-links; refactors safUriToFilesystemPath to shared utils; adds Preference/Sync health link.
Android build pipeline improvements
scripts/patch-android-gradle.mjs, scripts/android-gradle.properties, scripts/android-env.mjs, scripts/sign-android-apks.mjs, package.json, .github/workflows/release.yml
Adds patchAndroidGradle() to inject Gradle JVM/parallel/caching properties; detects sccache and sets RUSTC_WRAPPER; extends APK signing with --debug mode; adds Gradle and Rust caches to CI release jobs.
Idiomatic Rust refactors
src-tauri/risuko-cookies/src/browser/..., src-tauri/risuko-cookies/src/utils/paths.rs, src-tauri/risuko-engine/src/engine/...
Replaces manual Ok-unwrapping loops with .flatten(); uses strip_prefix('.') instead of starts_with + slicing for domain matching; uses ? in gwcache and rss rule_engine; uses .values() in manager iteration; uses Option equality in HTTP resume validation.

Trellis AI Workflow System Bootstrap

Layer / File(s) Summary
Core Python utilities: types, paths, config, I/O
.trellis/scripts/common/types.py, paths.py, config.py, trellis_config.py, io.py, log.py, git.py, __init__.py
Adds TaskData, TaskInfo, AgentRecord; paths.py with repo-root detection, developer helpers, and task-ref normalization; config.py with minimal YAML parser and session/journal/hook/package/spec-scope accessors; shared JSON I/O and ANSI log helpers; Windows UTF-8 stream reconfiguration.
Session-scoped active task and context injection
.trellis/scripts/common/active_task.py, packages_context.py, workflow_phase.py
Adds ActiveTask dataclass, resolve_context_key with Cursor-ticket fallback, resolve_active_task, set_active_task, clear_active_task; package/spec-layer discovery for text and JSON output; phase-index and step extraction from workflow.md with platform filtering.
Task CRUD, archiving, safe-commit, and queue
.trellis/scripts/common/task_store.py, task_utils.py, tasks.py, safe_commit.py, task_context.py, task_queue.py
cmd_create/cmd_archive with parent/child linking, JSONL seeding, and auto-commit; safe git staging that never uses -f; JSONL context add/validate/list; task listing and stats helpers.
Session journaling, context CLI, and platform adapter
.trellis/scripts/common/session_context.py, add_session.py, developer.py, cli_adapter.py, git_context.py, get_context.py, get_developer.py, init_developer.py
session_context.py generates default and record-mode context (git status, active tasks, journal metadata, update hint); add_session.py manages journal part rollover and index.md updates with auto-commit; CLIAdapter abstracts 17 AI platform CLI behaviors.
task.py CLI, Linear sync hook, workflow config
.trellis/scripts/task.py, .trellis/scripts/hooks/linear_sync.py, .trellis/config.yaml, .trellis/.gitignore, .trellis/.version, AGENTS.md
task.py CLI with start (degraded-mode fallback), finish, current, list, list-archive; Linear issue sync hook; full config.yaml with worker guard, journal, and hook settings; .gitignore for runtime state; version marker 0.6.5.
Workflow definition, agent cards, and entry points
.trellis/workflow.md, .trellis/agents/implement.md, .trellis/agents/check.md, .agents/workflows/start.md, .agents/workflows/continue.md, .agents/workflows/finish-work.md
Full 3-phase workflow with breadcrumb contract, phase index, and workflow-state blocks; implement and check agent cards with forbidden-op constraints and report templates; session start, resume, and finish-work entry points.
Bundled AI skills
.agents/skills/trellis-brainstorm/*, trellis-check/*, trellis-channel/*, trellis-meta/*, trellis-session-insight/*, trellis-spec-bootstrap/*, trellis-update-spec/*, trellis-before-dev/*, trellis-break-loop/*
Adds all bundled skill SKILL.md files and reference documents covering requirements brainstorming, quality checks, multi-agent channel runtime (command reference, forum, workers, workflows), local architecture meta-documentation, session memory retrieval, spec bootstrapping, spec updating, pre-dev checklist, and break-loop analysis.
Spec templates, guides, workspace, and bootstrap task
.trellis/spec/frontend/*, .trellis/spec/guides/*, .trellis/workspace/..., .trellis/tasks/00-bootstrap-guidelines/...
Frontend spec placeholder files (component, directory, hooks, state, type-safety, quality); thinking guides for code reuse and cross-layer analysis; YueMiyuki workspace index and journal; bootstrap task definition.

Sequence Diagram

sequenceDiagram
  participant Frontend
  participant TauriCmd as share_cmds
  participant ShareManager
  participant iroh as iroh endpoint
  participant RemotePeer

  rect rgba(70, 130, 180, 0.5)
    note over Frontend, iroh: Send Flow
    Frontend->>TauriCmd: share_start_send(id, paths)
    TauriCmd->>ShareManager: start_send(id, paths)
    ShareManager->>iroh: bind endpoint + build ticket
    ShareManager-->>Frontend: SendInfo{ticket, files}
    RemotePeer->>iroh: connect with ticket
    iroh->>ShareManager: provider request event
    ShareManager->>Frontend: emit share:event Connected/Progress/Completed
  end

  rect rgba(60, 179, 113, 0.5)
    note over Frontend, RemotePeer: Receive Flow
    Frontend->>TauriCmd: share_start_receive(id, ticket, dest, files)
    TauriCmd->>ShareManager: start_receive(id, ticket, dest, files)
    ShareManager->>iroh: bind + MemoryLookup seed
    iroh->>RemotePeer: download blobs
    ShareManager->>Frontend: emit share:event Connected/Progress/Completed
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • YueMiyuki/Risuko#85: Overlaps directly on Android sharing infrastructure — android_intent.rs NDK/JNI plumbing, share_cmds.rs command registration in lib.rs, and the /share frontend route and deep-link handling in main.ts and router/index.ts.

Suggested labels

next

🐇 A hop through the code, what wonders I see,
Blobs flying through iroh, shared wild and free!
QR codes blooming, the channel runtime sings,
Trellis skills sprouting like fresh garden things.
From Android to desktop, the tickets take flight—
The rabbit says: sharing has never felt right! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title is generic and doesn't describe the main changeset, so it isn't specific enough to scan history. Replace it with a concise summary of the primary change, such as adding the Trellis workflow and tooling.
✅ Passed checks (4 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The description matches the changeset, covering Trellis workflow docs/scripts, CI updates, Android signing, and the new share feature.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread scripts/android-env.mjs Dismissed
@coderabbitai coderabbitai Bot added the next The "next" steps label Jun 28, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

13 issues found across 148 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".agents/skills/trellis-channel/references/workflows.md">

<violation number="1" location=".agents/skills/trellis-channel/references/workflows.md:67">
P2: Workflow example uses unsupported `--tag` flag in `trellis channel messages` command</violation>
</file>

<file name=".agents/skills/trellis-channel/references/command-reference.md">

<violation number="1" location=".agents/skills/trellis-channel/references/command-reference.md:203">
P1: Command reference internally contradicts the event kind produced by `channel interrupt`. The `interrupt` command section claims it appends an `interrupt` event, but the Event Model whitelist (`CHANNEL_EVENT_KINDS`) lists `interrupt_requested` and `interrupted` without `interrupt`, and the `tag-vs-kind` section says the command appends an `interrupt_requested` / `interrupted` pair. Users relying on the `interrupt` command description would be unable to filter with `--kind interrupt` because it is not in the whitelist.</violation>
</file>

<file name=".trellis/scripts/common/developer.py">

<violation number="1" location=".trellis/scripts/common/developer.py:56">
P1: Developer name is used as a raw path segment without sanitization, allowing path traversal (e.g., `../attacker` resolves outside `.trellis/workspace/`).</violation>
</file>

<file name=".agents/skills/trellis-break-loop/SKILL.md">

<violation number="1" location=".agents/skills/trellis-break-loop/SKILL.md:184">
P2: The break-loop skill mandates syncing local specs to `src/templates/markdown/spec/`, but this path does not exist in the repository and conflicts with the local-only `.trellis/spec/` workflow established by the sibling `trellis-update-spec` skill. In an application project (not the Trellis framework repo), this instruction would fail or cause agents to edit non-existent/inappropriate paths.</violation>
</file>

<file name=".trellis/scripts/common/task_utils.py">

<violation number="1" location=".trellis/scripts/common/task_utils.py:60">
P1: archive_task_dir does not guard against archive destination collisions before shutil.move</violation>
</file>

<file name=".trellis/scripts/common/safe_commit.py">

<violation number="1" location=".trellis/scripts/common/safe_commit.py:121">
P1: `safe_trellis_paths_to_add` looks for an archived task at `.trellis/tasks/archive/<task_name>`, but the actual archive layout uses `.trellis/tasks/archive/YYYY-MM/<task_name>`. This path mismatch causes archived tasks to be omitted from the staging list.</violation>
</file>

<file name=".trellis/scripts/common/cli_adapter.py">

<violation number="1" location=".trellis/scripts/common/cli_adapter.py:559">
P2: `supports_cli_agents` is inconsistent with `build_run_command` and `build_resume_command`. It returns `True` for only five platforms, but `build_run_command` has valid CLI branches for `kiro`, `gemini`, and `qoder` (and `build_resume_command` does too). Any upstream code that gates calls via `supports_cli_agents` will incorrectly disable execution for those three platforms.</violation>
</file>

<file name=".agents/skills/trellis-channel/references/progress-debugging.md">

<violation number="1" location=".agents/skills/trellis-channel/references/progress-debugging.md:136">
P1: Stale CLI commands and flags in progress-debugging.md conflict with the current command reference (`wait --tag`, `forum list`, `thread show`, `context --as`).</violation>
</file>

<file name=".trellis/scripts/common/task_store.py">

<violation number="1" location=".trellis/scripts/common/task_store.py:388">
P1: cmd_archive can archive/move any existing directory, not just valid Trellis task directories.</violation>
</file>

<file name=".agents/skills/trellis-session-insight/references/triggering-patterns.md">

<violation number="1" location=".agents/skills/trellis-session-insight/references/triggering-patterns.md:83">
P2: Session-insight trigger guidance references undocumented `trellis mem list --task` flag that conflicts with the skill's own CLI reference.</violation>
</file>

<file name=".agents/skills/trellis-channel/references/workers.md">

<violation number="1" location=".agents/skills/trellis-channel/references/workers.md:159">
P1: `send` example uses non-existent `--tag` flag</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

```bash
trellis channel wait T --as main --from check --kind done --timeout 15m
trellis channel wait T --as main --from check,check-cx --kind done --all --timeout 15m
trellis channel wait T --as worker --tag interrupt --timeout 1h

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Stale CLI commands and flags in progress-debugging.md conflict with the current command reference (wait --tag, forum list, thread show, context --as).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .agents/skills/trellis-channel/references/progress-debugging.md, line 136:

<comment>Stale CLI commands and flags in progress-debugging.md conflict with the current command reference (`wait --tag`, `forum list`, `thread show`, `context --as`).</comment>

<file context>
@@ -0,0 +1,226 @@
+```bash
+trellis channel wait T --as main --from check --kind done --timeout 15m
+trellis channel wait T --as main --from check,check-cx --kind done --all --timeout 15m
+trellis channel wait T --as worker --tag interrupt --timeout 1h
+trellis channel wait T --as main --thread release-note --action status --timeout 10m
+```
</file context>


Behavior:
- Appends an `interrupt` event with `reason: "user"` and a replacement
instruction body; supervisor performs provider-level interrupt where

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Command reference internally contradicts the event kind produced by channel interrupt. The interrupt command section claims it appends an interrupt event, but the Event Model whitelist (CHANNEL_EVENT_KINDS) lists interrupt_requested and interrupted without interrupt, and the tag-vs-kind section says the command appends an interrupt_requested / interrupted pair. Users relying on the interrupt command description would be unable to filter with --kind interrupt because it is not in the whitelist.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .agents/skills/trellis-channel/references/command-reference.md, line 203:

<comment>Command reference internally contradicts the event kind produced by `channel interrupt`. The `interrupt` command section claims it appends an `interrupt` event, but the Event Model whitelist (`CHANNEL_EVENT_KINDS`) lists `interrupt_requested` and `interrupted` without `interrupt`, and the `tag-vs-kind` section says the command appends an `interrupt_requested` / `interrupted` pair. Users relying on the `interrupt` command description would be unable to filter with `--kind interrupt` because it is not in the whitelist.</comment>

<file context>
@@ -0,0 +1,480 @@
+
+Behavior:
+- Appends an `interrupt` event with `reason: "user"` and a replacement
+  instruction body; supervisor performs provider-level interrupt where
+  supported (Claude `/interrupt`, Codex turn cancel).
+- Prints the appended event JSON on stdout.
</file context>

tasks_dir = get_tasks_dir(repo_root)

# Resolve task directory (supports task name, relative path, or absolute path)
task_dir = resolve_task_dir(task_name, repo_root)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: cmd_archive can archive/move any existing directory, not just valid Trellis task directories.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .trellis/scripts/common/task_store.py, line 388:

<comment>cmd_archive can archive/move any existing directory, not just valid Trellis task directories.</comment>

<file context>
@@ -0,0 +1,747 @@
+    tasks_dir = get_tasks_dir(repo_root)
+
+    # Resolve task directory (supports task name, relative path, or absolute path)
+    task_dir = resolve_task_dir(task_name, repo_root)
+
+    if not task_dir or not task_dir.is_dir():
</file context>

repo_root = get_repo_root()

dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER
workspace_dir = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / name

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Developer name is used as a raw path segment without sanitization, allowing path traversal (e.g., ../attacker resolves outside .trellis/workspace/).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .trellis/scripts/common/developer.py, line 56:

<comment>Developer name is used as a raw path segment without sanitization, allowing path traversal (e.g., `../attacker` resolves outside `.trellis/workspace/`).</comment>

<file context>
@@ -0,0 +1,190 @@
+        repo_root = get_repo_root()
+
+    dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER
+    workspace_dir = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / name
+
+    # Create .developer file
</file context>

# Final check: ensure resolved path is not the repo root
abs_path = repo_root / Path(normalized)
if abs_path.exists():
try:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: archive_task_dir does not guard against archive destination collisions before shutil.move

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .trellis/scripts/common/task_utils.py, line 60:

<comment>archive_task_dir does not guard against archive destination collisions before shutil.move</comment>

<file context>
@@ -0,0 +1,274 @@
+    # Final check: ensure resolved path is not the repo root
+    abs_path = repo_root / Path(normalized)
+    if abs_path.exists():
+        try:
+            resolved = abs_path.resolve()
+            root_resolved = repo_root.resolve()
</file context>

Comment thread src-tauri/risuko-share/src/lib.rs Outdated
- If it's a code reuse issue → update `code-reuse-thinking-guide.md`
- If it's domain-specific → update `backend/*.md` or `frontend/*.md`

2. **Sync templates** - After updating `.trellis/spec/`, sync to `src/templates/markdown/spec/`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The break-loop skill mandates syncing local specs to src/templates/markdown/spec/, but this path does not exist in the repository and conflicts with the local-only .trellis/spec/ workflow established by the sibling trellis-update-spec skill. In an application project (not the Trellis framework repo), this instruction would fail or cause agents to edit non-existent/inappropriate paths.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .agents/skills/trellis-break-loop/SKILL.md, line 184:

<comment>The break-loop skill mandates syncing local specs to `src/templates/markdown/spec/`, but this path does not exist in the repository and conflicts with the local-only `.trellis/spec/` workflow established by the sibling `trellis-update-spec` skill. In an application project (not the Trellis framework repo), this instruction would fail or cause agents to edit non-existent/inappropriate paths.</comment>

<file context>
@@ -0,0 +1,188 @@
+   - If it's a code reuse issue → update `code-reuse-thinking-guide.md`
+   - If it's domain-specific → update `backend/*.md` or `frontend/*.md`
+
+2. **Sync templates** - After updating `.trellis/spec/`, sync to `src/templates/markdown/spec/`
+
+3. **Commit the spec updates** - This is the primary output, not just the analysis text
</file context>

Comment thread scripts/patch-android-gradle.mjs Outdated
- "记一下这次踩的坑"
- "复盘下这个任务"

Reach: identify the current task's session id (from `.trellis/.runtime/sessions/*.json` or `mem list --task <task-dir>`), then `extract <id> --phase brainstorm` and `--phase implement`. Present a summary — surface concrete file:line citations where possible. Whether to also write the summary somewhere (PRD, spec, notes file) is the user's call; offer, don't auto-write.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Session-insight trigger guidance references undocumented trellis mem list --task flag that conflicts with the skill's own CLI reference.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .agents/skills/trellis-session-insight/references/triggering-patterns.md, line 83:

<comment>Session-insight trigger guidance references undocumented `trellis mem list --task` flag that conflicts with the skill's own CLI reference.</comment>

<file context>
@@ -0,0 +1,93 @@
+- "记一下这次踩的坑"
+- "复盘下这个任务"
+
+Reach: identify the current task's session id (from `.trellis/.runtime/sessions/*.json` or `mem list --task <task-dir>`), then `extract <id> --phase brainstorm` and `--phase implement`. Present a summary — surface concrete file:line citations where possible. Whether to also write the summary somewhere (PRD, spec, notes file) is the user's call; offer, don't auto-write.
+
+## Anti-patterns: do NOT reach for `mem` here
</file context>
Suggested change
Reach: identify the current task's session id (from `.trellis/.runtime/sessions/*.json` or `mem list --task <task-dir>`), then `extract <id> --phase brainstorm` and `--phase implement`. Present a summary — surface concrete file:line citations where possible. Whether to also write the summary somewhere (PRD, spec, notes file) is the user's call; offer, don't auto-write.
Reach: identify the current task's session id (from `.trellis/.runtime/sessions/*.json` or `trellis mem list --cwd <project-path>`), then `extract <id> --phase brainstorm` and `--phase implement`. Present a summary — surface concrete file:line citations where possible. Whether to also write the summary somewhere (PRD, spec, notes file) is the user's call; offer, don't auto-write.

Claude Code, OpenCode, iFlow, and Codex support CLI agent execution.
Cursor is IDE-only and doesn't support CLI agents.
"""
return self.platform in ("claude", "opencode", "iflow", "codex", "pi")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: supports_cli_agents is inconsistent with build_run_command and build_resume_command. It returns True for only five platforms, but build_run_command has valid CLI branches for kiro, gemini, and qoder (and build_resume_command does too). Any upstream code that gates calls via supports_cli_agents will incorrectly disable execution for those three platforms.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .trellis/scripts/common/cli_adapter.py, line 559:

<comment>`supports_cli_agents` is inconsistent with `build_run_command` and `build_resume_command`. It returns `True` for only five platforms, but `build_run_command` has valid CLI branches for `kiro`, `gemini`, and `qoder` (and `build_resume_command` does too). Any upstream code that gates calls via `supports_cli_agents` will incorrectly disable execution for those three platforms.</comment>

<file context>
@@ -0,0 +1,851 @@
+        Claude Code, OpenCode, iFlow, and Codex support CLI agent execution.
+        Cursor is IDE-only and doesn't support CLI agents.
+        """
+        return self.platform in ("claude", "opencode", "iflow", "codex", "pi")
+
+    @property
</file context>
Suggested change
return self.platform in ("claude", "opencode", "iflow", "codex", "pi")
return self.platform in ("claude", "opencode", "iflow", "codex", "kiro", "gemini", "qoder", "pi")

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 47

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.trellis/.gitignore (1)

13-33: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Ignore hooks.local.json as documented.

linear_sync.py treats .trellis/hooks.local.json as local gitignored config, but this ignore file never excludes it. That makes team/project mappings easy to commit accidentally.

Possible fix
 # Agent runtime files
 .agents/
 .agent-log
 .session-id
+hooks.local.json
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.trellis/.gitignore around lines 13 - 33, The .gitignore entry for local
Trellis config is missing hooks.local.json, so add an ignore rule for that file
alongside the existing agent/task runtime ignores. Update the
.trellis/.gitignore contents to exclude hooks.local.json as documented, keeping
the change near the current local config/runtime patterns so it’s easy to find.
Use the existing local config section around .agents/, .agent-log, and
.session-id as the anchor for the new ignore rule.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/skills/trellis-break-loop/SKILL.md:
- Around line 179-185: The guide reference in the SKILL.md decision list points
to cross-platform-thinking-guide.md, but that file is missing from
.trellis/spec/guides/. Update the reference to the correct existing guide name
in the relevant section, or add the missing guide file if that is the intended
target, and keep the sync step to src/templates/markdown/spec/ aligned with the
change. Refer to the SKILL.md guide-selection rules and the sync templates
instruction when making the fix.
- Line 184: The sync target path referenced in the skill is incorrect because
src/templates/markdown/spec/ does not exist here. Update the “Sync templates”
guidance to point to the actual template output directory used by the project,
or add the missing destination if that is the intended target. Make sure the
instruction in SKILL.md matches the real path so the sync step references the
correct location.

In @.agents/skills/trellis-channel/references/command-reference.md:
- Line 136: The `wait` and `messages` examples in the command reference still
mention a `--tag` filter, but the authoritative tag-vs-kind section says that
flag does not exist in the v0.6.0 channel CLI. Update the documentation around
the `wait` and `messages` command descriptions to either remove `--tag` entirely
or replace it with the correct supported filter, and make sure the `wait`,
`messages`, and tag-vs-kind sections all use the same terminology.

In @.agents/skills/trellis-channel/references/progress-debugging.md:
- Around line 149-153: The messages filter description includes an unsupported
--tag flag, which conflicts with the authoritative command reference. Update the
`messages` section in `progress-debugging.md` to remove `--tag` from the listed
filters and keep only the flags that are actually documented elsewhere,
preserving consistency with `command-reference.md`.
- Line 136: The `trellis channel wait` example in the progress debugging guide
is using an invalid `--tag` flag; update that example to use the event kind
model instead. Edit the `wait` command example so it matches the CLI documented
by `command-reference.md`, replacing `--tag interrupt` with `--kind interrupt`
in the `trellis channel wait` reference.

In @.agents/skills/trellis-channel/references/workers.md:
- Around line 154-161: The `trellis channel send` example in `workers.md` is
using an invalid `--tag question` flag that does not exist on the `send`
command. Update the example near the low-priority hint guidance to remove the
flag or reword it so the “question” label is conveyed in the message body
instead, and keep the example aligned with the `send` behavior described by
`command-reference.md` and the `send` command usage.

In @.agents/skills/trellis-meta/references/customize-local/change-workflow.md:
- Line 27: The workflow-state documentation needs to warn more clearly that
mismatched STATUS tags are silently dropped and add a simple verification step.
Update the guidance around the [workflow-state:STATUS] block in
change-workflow.md to explicitly call out that
[workflow-state:foo]…[/workflow-state:bar] mistakes remove the whole block
without warning, and recommend a quick validation or check after editing. Keep
the note tied to the existing workflow-state parser-only behavior so users know
to verify the exact opening and closing tag names.

In @.agents/skills/trellis-meta/references/local-architecture/bundled-skills.md:
- Line 19: The bundled skills heading still shows an outdated Trellis version,
so update the version text in the bundled skills document to match the current
release. Check the heading that currently says "Current Bundled Skills (v0.6.0)"
and change it to the correct Trellis version used by this bootstrap, or rename
it to clearly indicate it is an API version if that is what it represents.

In
@.agents/skills/trellis-meta/references/local-architecture/context-injection.md:
- Line 50: The document uses the undefined term “seed rows,” so update the
guidance in context-injection.md to use clearer wording tied to the JSONL
structure. Refer to the description around the reader behavior and explain that
rows without a file field should be skipped, while only spec/research files
should be included when configuring JSONL, so readers can understand exactly
which entries are meant without relying on an undefined term.

In
@.agents/skills/trellis-meta/references/local-architecture/multi-agent-channel.md:
- Around line 49-52: The markdown table in the multi-agent channel reference has
a malformed row where the “Override worker guard per spawn” entry includes both
the CLI flags and the environment variable fallback in one row, but the table
only has two columns. Update that section by either splitting the environment
variable fallback into its own row or adding a third header column, and keep the
`channel.worker_guard` / `trellis channel spawn` guidance aligned with the
existing table structure so markdown parsers render it correctly.

In @.agents/skills/trellis-spec-bootstrap/references/spec-writing.md:
- Around line 66-68: The placeholder check command in the spec-writing reference
uses grep alternation syntax that is not portable across GNU and BSD/macOS grep.
Update the command in the spec-writing guidance to use extended regex with grep
-E (for example, in the placeholder search under the placeholder check section)
so the pattern works consistently across environments.

In @.github/workflows/release.yml:
- Around line 42-43: The release workflow is using mutable action tags instead
of immutable SHAs. Update the action references in all three jobs so
`setup-gradle` in the `Cache Gradle dependencies` step uses
`gradle/actions/setup-gradle@ed408507eac070d1f99cc633dbcf757c94c7933a`, and
replace every `Swatinem/rust-cache@v2` usage with
`Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32`; use the existing
job and step names in `.github/workflows/release.yml` to locate each occurrence.

In @.trellis/scripts/add_session.py:
- Around line 518-523: The content loading flow in add_session.py currently
ignores a missing args.content_file path and falls back to the default session
text, so update the args.content_file handling to validate the Path before
reading and raise an explicit error or exit non-zero when content_path.is_file()
is false. Keep the fix scoped to the existing content_path / extra_content logic
in the content file and stdin branch so callers do not silently lose intended
notes.
- Around line 290-309: The history migration in add_session.py only updates the
table header and leaves legacy 4- or 6-column session rows untouched, so older
index.md files can end up with a malformed table after the first append. Update
the rewrite path in the in_session_history block to normalize existing body rows
to the new 5-column Branch-only shape as well, using the same session history
processing that already handles header detection and header_written.

In @.trellis/scripts/common/active_task.py:
- Around line 122-135: resolve_task_ref currently accepts absolute paths
verbatim, which lets active task refs escape the Trellis task store; update this
in active_task.py so only refs under DIR_WORKFLOW/DIR_TASKS are accepted. In
resolve_task_ref, validate the normalized path before returning it, reject
absolute paths and any path that does not resolve inside repo_root /
DIR_WORKFLOW / DIR_TASKS, and keep _canonical_task_ref() from persisting
out-of-store locations. Use the existing symbols resolve_task_ref,
normalize_task_ref, DIR_WORKFLOW, and DIR_TASKS to implement the guard
consistently.
- Around line 470-497: The fallback in resolve_active_task is too broad: when
resolve_context_key() returns a known context key but that context has no
current_task, it should not call _resolve_single_session_fallback(). Update
resolve_active_task so the session-fallback path is only used when no context
key is known at all; if a known context is missing/empty, return
ActiveTask(None, "none", context_key) directly. Use resolve_active_task,
resolve_context_key, and _resolve_single_session_fallback to locate the logic.

In @.trellis/scripts/common/cli_adapter.py:
- Around line 163-232: Keep Trellis command path generation aligned across
platforms by updating get_commands_path() to use the same canonical locations as
get_trellis_command_path() for codex, kiro, and gemini. Right now
get_commands_path() still routes through platform-specific command
directories/files that no longer match the Trellis helper, so adjust the
platform branches in cli_adapter.py to return the corresponding skills/prompt
locations and naming conventions used by get_trellis_command_path(). Make sure
the shared path logic stays consistent for both writing and lookup across these
symbols.

In @.trellis/scripts/common/config.py:
- Around line 271-289: The get_packages() helper is filtering out scalar package
declarations, so shorthand entries like packages: {frontend: src} get lost and
later package resolution breaks. Update get_packages() in config.py to preserve
scalar values alongside dict values instead of discarding them, so
get_package_path() can continue handling both forms; keep the existing
normalization around config.get("packages") and return None only when packages
is absent or empty.

In @.trellis/scripts/common/developer.py:
- Around line 55-67: Make the developer initialization atomic in
init_developer() by ensuring the .developer marker is only created after the
workspace, journal, and index setup succeeds. Update the flow around
dev_file.write_text and the later workspace/journal/index creation steps so a
failure does not leave a stale marker behind; either write .developer last or
delete it in a rollback path if any earlier step fails. Use the existing
init_developer() and dev_file handling to place the fix consistently across the
affected initialization sections.
- Around line 48-57: Reject unsafe developer names before any path is built:
`name` is currently concatenated into `workspace_dir` in
`.trellis/scripts/common/developer.py`, so values like `../`, nested paths, or
absolute paths can escape `.trellis/workspace`. Add validation in the developer
creation flow (the function that builds `dev_file` and `workspace_dir`) to allow
only a safe slug format and reject anything else, and apply the same check to
the related code paths mentioned in the comment so `mkdir()` and `write_text()`
never receive an unsafe `name`.

In @.trellis/scripts/common/git_context.py:
- Around line 51-63: The `--json` flag is not honored in the `phase` path, so
callers get plain text from the `main`/`parse` flow even though the CLI docs say
it works with any mode. Update the `phase` branch in the git context script to
either serialize the extracted phase data as JSON when `args.json` is set, or
explicitly reject `--json` for `--mode phase` with a clear error; use the
existing `--json`, `--mode`, and `phase` handling in `main`/argument parsing to
locate the fix.

In @.trellis/scripts/common/io.py:
- Around line 25-37: The shared JSON writer should handle parent-directory setup
instead of relying on callers like common.active_task._write_json. Update
write_json() in common.io to ensure the target path’s parent directory exists
before calling Path.write_text, so first writes to new subtrees succeed
consistently. Keep the fix localized to write_json() and preserve its existing
success/failure behavior.
- Around line 14-22: `read_json()` currently returns whatever `json.loads()`
parses, which can violate its declared `dict | None` contract. Update the
`read_json` helper to validate the parsed value is a dictionary before returning
it, and otherwise return `None`; keep the existing exception handling for
unreadable or invalid files. Use the `read_json` function in
`.trellis/scripts/common/io.py` as the place to enforce this object-only
behavior so callers can safely rely on `.get(...)` and key access.

In @.trellis/scripts/common/paths.py:
- Around line 43-62: The fallback in get_repo_root currently ignores an explicit
start_path and always returns Path.cwd(), which can resolve the wrong repository
when probing from another directory. Update get_repo_root so the final fallback
preserves the originally searched path (the resolved start_path/current value)
instead of the process working directory, while keeping the DIR_WORKFLOW
directory check and traversal logic unchanged.

In @.trellis/scripts/common/safe_commit.py:
- Around line 176-187: The narrow-scope path in safe_commit.py is still staging
the entire archive tree instead of only the targeted task archive. Update the
task_name branch in the path-building logic so it appends the specific archive
subdirectory for that task (not DIR_ARCHIVE itself), while keeping
modified_children limited to their exact paths. Use the existing task_name,
archive_dir, and paths handling in safe_commit.py to locate and fix the staging
behavior.

In @.trellis/scripts/common/task_context.py:
- Around line 50-60: The path handling in task_context.py currently allows
absolute paths and `..` traversal to flow through into the JSONL manifest, which
can let non-repo files be recorded and later loaded by sub-agents. Update the
validation around the path normalization logic in the task context builder to
reject absolute paths and any path that escapes the repository root before
computing `full_path`, and ensure the manifest-writing code that persists
entries only stores repo-relative paths. Use the existing task context flow
around `jsonl_file`, `full_path`, and the JSONL entry creation/persistence to
keep all context manifests confined to repository content.

In @.trellis/scripts/common/task_store.py:
- Around line 254-292: The create flow in task_store.py currently only warns
when task_dir already exists, but still rebuilds task_data and calls write_json,
which overwrites the existing task.json. Update the task creation path so that
an existing task directory is left untouched, using the existing task_dir/slug
handling in the create logic and write_json call as the guard point. If the
directory already exists, return early or skip serialization so status, branch,
notes, and link fields are preserved.
- Around line 635-647: The unlink logic in task_store.py is clearing the child’s
parent unconditionally, which can orphan a task when remove-subtask is called
with the wrong parent. In the unlink flow around the parent/child update and
write_json calls, first verify that the child’s recorded parent matches the
requested parent before mutating either task; use the existing parent_data,
child_data, and child_dir_name values to guard the removal. If the recorded
parent does not match args.parent_dir, abort without changing children or parent
fields so the wrong pair is not unlinked.

In @.trellis/scripts/common/task_utils.py:
- Around line 232-249: The hook execution in get_hooks/task_utils.py is unsafe
because hook strings are run through subprocess.run with shell=True while
TASK_JSON_PATH comes from task-derived input. Update the hook execution path to
avoid shell interpolation by switching to an argv-based hook format in the
get_hooks/cmd handling, or otherwise provide a safely pre-quoted variable and
ensure the raw path is not intended for direct expansion. If you keep
shell-based hooks, document the safe variable name and make the existing
TASK_JSON_PATH usage non-interpolated by default.
- Around line 76-99: The suffix lookup in find_task_by_name can return an
arbitrary match from tasks_dir.iterdir(), so ambiguous shorthand names may
resolve to the wrong task. Update find_task_by_name to reject or explicitly
handle multiple directories ending with the same task_name suffix by collecting
all matches, returning only a single unambiguous result, and otherwise returning
None or signaling ambiguity; keep the exact-match path behavior unchanged.
- Around line 27-69: is_safe_task_path currently only blocks repo-root paths, so
repo-relative non-task directories can still be treated as safe. Update the
validation in task_utils.is_safe_task_path to anchor allowed paths under the
.trellis/tasks tree by rejecting any path that resolves outside that directory,
while keeping the existing absolute-path and traversal checks. Use the existing
repo_root/abs_path/resolved logic to compare against the resolved .trellis/tasks
base and ensure callers cannot operate on .git, .trellis/spec, or other non-task
paths.

In @.trellis/scripts/common/trellis_config.py:
- Around line 73-75: The list-item parsing in trellis_config.py currently
appends raw `_unquote(...)` values for entries handled by the
`stripped.startswith("- ")` branch, so inline comments are preserved there
unlike scalar values. Update that list-item path to apply
`_strip_inline_comment()` before `_unquote()`, using the existing helpers in the
same parser logic so list entries like `- foo # note` are normalized
consistently with mapping values.

In @.trellis/scripts/hooks/linear_sync.py:
- Around line 90-104: The _linearis helper currently calls subprocess.run
without guarding launcher failures or hangs, so task lifecycle commands can
stall or crash; update _linearis to handle missing/execution errors and add a
timeout around the linearis invocation. Keep the existing stderr reporting and
exit behavior in the nonzero return path, but make sure subprocess-related
exceptions are caught and treated as a warning/degraded failure so task.py
create/start/archive can continue safely.

In @.trellis/scripts/task.py:
- Around line 212-251: The _print_task() traversal is incorrectly skipping
entire subtrees when a parent fails the --mine or --status filters, so matching
children never get visited. Update the filtering in _print_task() so it only
suppresses printing the current node, but still always recurses into children in
the loop over t.children. Use _print_task, filter_mine, filter_status, and
children_progress to keep the traversal intact while applying filters only at
display time.

In @.trellis/spec/frontend/directory-structure.md:
- Around line 25-30: The placeholder directory tree block in the markdown spec
needs a fenced code block language tag to satisfy markdownlint MD040. Update the
directory structure example in the spec so the fenced block uses a specifier
such as text or tree, keeping the existing placeholder content intact.

In @.trellis/spec/guides/cross-layer-thinking-guide.md:
- Line 25: The fenced diagram block in the cross-layer thinking guide is missing
a language specifier, so update the Markdown fence used for the ASCII diagram to
declare text for consistent parsing. Locate the diagram block in the guide and
adjust the fence syntax accordingly without changing the diagram content.
- Line 306: The fenced ASCII diagram in the cross-layer thinking guide is
missing a language specifier, so update the markdown fence used for that diagram
to identify it as text. Locate the diagram block around the referenced section
and ensure the fence is labeled with text for consistent Markdown parsing.
- Around line 223-287: Remove the accidentally duplicated guidance blocks from
the guide so each checklist appears only once. Delete the repeated
“Cross-Platform Template Consistency”, “Generated Runtime Template Upgrade
Consistency”, and “Mode-Detection Probe Checklist” sections in the later portion
of the document, keeping the original versions earlier in the file. Use the
section headings and checklist text to locate the duplicates precisely.

In @.trellis/workspace/index.md:
- Around line 13-22: The tree diagram in index.md is shown as a code block but
is missing its language specifier; update the markdown fence for the workspace
structure snippet to use the text language tag so it renders consistently. Make
this change in the index.md content near the workspace directory tree, keeping
the existing diagram and formatting unchanged aside from adding the specifier.
- Around line 40-60: The markdown in the “For Returning Developers” section has
fenced code blocks that are missing surrounding blank lines, triggering MD031
warnings. Update the affected fenced blocks in the workspace index so each
`bash` code fence in that section is preceded and followed by a blank line,
keeping the existing content and structure intact.

In `@package.json`:
- Line 63: The dependency declaration for `@types/node` is out of sync with the
supported runtime floor, since it tracks Node 26 APIs while engines.node still
allows Node 22. Update package.json so the typings line matches the Node 22
runtime support, or, if the project is intentionally moving forward, raise
engines.node and any matching CI/runtime checks to 26 so the types and runtime
stay aligned.

In `@scripts/android-env.mjs`:
- Around line 7-14: The sccache detection in findSccache is Unix-only because it
shells out to which, so Windows installs are missed and RUSTC_WRAPPER can remain
unset. Update findSccache to use a platform-aware lookup path: on win32, probe
with where.exe or scan PATH in Node, while keeping the existing
process.env.RUSTC_WRAPPER fallback. Also adjust the warning/hint text around the
sccache lookup to stay generic instead of assuming brew, and apply the same
platform-aware change wherever this lookup is duplicated.

In `@src-tauri/risuko-share/src/lib.rs`:
- Line 438: The receive completion cleanup is using the wrong collection: the
task path around the receive handler logic removes from the send-side active map
instead of the receive-side self.receives, leaving stale receive handles behind.
Update the completion/failure/terminal cleanup in the receive flow (the code
that uses the active clone) to remove entries from self.receives using the
receive id, and ensure the recv-{id} directory is deleted on every terminal path
in the same receive-processing code.
- Around line 503-519: The receive flow is still buffering blobs in memory and
leaving completed receive handles behind, so update the receive task to use the
on-disk blob directory instead of MemStore by loading a Store from
FsStore::load(blobs_dir) in the receive path. Also ensure the entry tracked in
self.receives is removed when the receive task finishes normally, not only from
cancel, so completed receives are cleaned up automatically; use the existing
receive task/handle logic around the store setup and task exit to make this
change.

In `@src-tauri/src/commands/android_intent.rs`:
- Around line 72-98: The one-time setup in init_ndk_context is still race-prone
because two ensure_ndk_context callers can both enter before NDK_CONTEXT_READY
is set, causing a spurious "ANDROID_APP already set" error. Serialize the entire
initialization path in init_ndk_context with a mutex or other one-time fallible
guard, and keep the existing JAVA_VM, ANDROID_APP, and NDK_CONTEXT_READY
checks/sets inside that protected section so only one thread can perform the
attach_current_thread and initialize_android_context flow.

In `@src/renderer/components/Share/Index.vue`:
- Around line 41-44: The Motion props are being passed function references
instead of the config objects they return. Update the usages of panelAnimate and
panelTransition in Share/Index.vue so Motion receives the result of calling
those helpers, and make sure the same fix is applied at both the template
bindings and any other call sites that currently pass them through unchanged.

In `@src/renderer/pages/index/main.ts`:
- Around line 206-207: The share-link parsing in main.ts should guard against
malformed percent-encoding before decoding so a bad URL does not abort
initialization. Update the logic around rawId and shareId to catch
decodeURIComponent failures in the existing error-handling path used by the
deep-link flow, and skip invalid risuko://share/ links so onOpenUrl registration
still completes.

---

Outside diff comments:
In @.trellis/.gitignore:
- Around line 13-33: The .gitignore entry for local Trellis config is missing
hooks.local.json, so add an ignore rule for that file alongside the existing
agent/task runtime ignores. Update the .trellis/.gitignore contents to exclude
hooks.local.json as documented, keeping the change near the current local
config/runtime patterns so it’s easy to find. Use the existing local config
section around .agents/, .agent-log, and .session-id as the anchor for the new
ignore rule.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ca6d9e9b-6487-45c0-985b-dc5b03d3658d

📥 Commits

Reviewing files that changed from the base of the PR and between 2921cde and f7f8e2d.

⛔ Files ignored due to path filters (5)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • src-tauri/Cargo.lock is excluded by !**/*.lock
  • src-tauri/gen/android/app/src/main/AndroidManifest.xml is excluded by !**/gen/**
  • src-tauri/gen/android/app/src/main/java/app/risuko/mobile/MainActivity.kt is excluded by !**/gen/**
  • src-tauri/gen/android/gradle.properties is excluded by !**/gen/**
📒 Files selected for processing (143)
  • .agents/skills/trellis-before-dev/SKILL.md
  • .agents/skills/trellis-brainstorm/SKILL.md
  • .agents/skills/trellis-break-loop/SKILL.md
  • .agents/skills/trellis-channel/SKILL.md
  • .agents/skills/trellis-channel/references/command-reference.md
  • .agents/skills/trellis-channel/references/forum.md
  • .agents/skills/trellis-channel/references/progress-debugging.md
  • .agents/skills/trellis-channel/references/workers.md
  • .agents/skills/trellis-channel/references/workflows.md
  • .agents/skills/trellis-check/SKILL.md
  • .agents/skills/trellis-meta/SKILL.md
  • .agents/skills/trellis-meta/references/customize-local/add-project-local-conventions.md
  • .agents/skills/trellis-meta/references/customize-local/change-agents.md
  • .agents/skills/trellis-meta/references/customize-local/change-context-loading.md
  • .agents/skills/trellis-meta/references/customize-local/change-hooks.md
  • .agents/skills/trellis-meta/references/customize-local/change-skills-or-commands.md
  • .agents/skills/trellis-meta/references/customize-local/change-spec-structure.md
  • .agents/skills/trellis-meta/references/customize-local/change-task-lifecycle.md
  • .agents/skills/trellis-meta/references/customize-local/change-workflow.md
  • .agents/skills/trellis-meta/references/customize-local/overview.md
  • .agents/skills/trellis-meta/references/local-architecture/bundled-skills.md
  • .agents/skills/trellis-meta/references/local-architecture/context-injection.md
  • .agents/skills/trellis-meta/references/local-architecture/generated-files.md
  • .agents/skills/trellis-meta/references/local-architecture/multi-agent-channel.md
  • .agents/skills/trellis-meta/references/local-architecture/overview.md
  • .agents/skills/trellis-meta/references/local-architecture/spec-system.md
  • .agents/skills/trellis-meta/references/local-architecture/task-system.md
  • .agents/skills/trellis-meta/references/local-architecture/workflow.md
  • .agents/skills/trellis-meta/references/local-architecture/workspace-memory.md
  • .agents/skills/trellis-meta/references/platform-files/agents.md
  • .agents/skills/trellis-meta/references/platform-files/hooks-and-settings.md
  • .agents/skills/trellis-meta/references/platform-files/overview.md
  • .agents/skills/trellis-meta/references/platform-files/platform-map.md
  • .agents/skills/trellis-meta/references/platform-files/skills-and-commands.md
  • .agents/skills/trellis-session-insight/SKILL.md
  • .agents/skills/trellis-session-insight/references/cli-quick-reference.md
  • .agents/skills/trellis-session-insight/references/triggering-patterns.md
  • .agents/skills/trellis-spec-bootstrap/SKILL.md
  • .agents/skills/trellis-spec-bootstrap/references/mcp-setup.md
  • .agents/skills/trellis-spec-bootstrap/references/repository-analysis.md
  • .agents/skills/trellis-spec-bootstrap/references/spec-task-planning.md
  • .agents/skills/trellis-spec-bootstrap/references/spec-writing.md
  • .agents/skills/trellis-update-spec/SKILL.md
  • .agents/workflows/continue.md
  • .agents/workflows/finish-work.md
  • .agents/workflows/start.md
  • .github/workflows/release.yml
  • .trellis/.gitignore
  • .trellis/.template-hashes.json
  • .trellis/.version
  • .trellis/agents/check.md
  • .trellis/agents/implement.md
  • .trellis/config.yaml
  • .trellis/scripts/__init__.py
  • .trellis/scripts/add_session.py
  • .trellis/scripts/common/__init__.py
  • .trellis/scripts/common/active_task.py
  • .trellis/scripts/common/cli_adapter.py
  • .trellis/scripts/common/config.py
  • .trellis/scripts/common/developer.py
  • .trellis/scripts/common/git.py
  • .trellis/scripts/common/git_context.py
  • .trellis/scripts/common/io.py
  • .trellis/scripts/common/log.py
  • .trellis/scripts/common/packages_context.py
  • .trellis/scripts/common/paths.py
  • .trellis/scripts/common/safe_commit.py
  • .trellis/scripts/common/session_context.py
  • .trellis/scripts/common/task_context.py
  • .trellis/scripts/common/task_queue.py
  • .trellis/scripts/common/task_store.py
  • .trellis/scripts/common/task_utils.py
  • .trellis/scripts/common/tasks.py
  • .trellis/scripts/common/trellis_config.py
  • .trellis/scripts/common/types.py
  • .trellis/scripts/common/workflow_phase.py
  • .trellis/scripts/get_context.py
  • .trellis/scripts/get_developer.py
  • .trellis/scripts/hooks/linear_sync.py
  • .trellis/scripts/init_developer.py
  • .trellis/scripts/task.py
  • .trellis/spec/frontend/component-guidelines.md
  • .trellis/spec/frontend/directory-structure.md
  • .trellis/spec/frontend/hook-guidelines.md
  • .trellis/spec/frontend/index.md
  • .trellis/spec/frontend/quality-guidelines.md
  • .trellis/spec/frontend/state-management.md
  • .trellis/spec/frontend/type-safety.md
  • .trellis/spec/guides/code-reuse-thinking-guide.md
  • .trellis/spec/guides/cross-layer-thinking-guide.md
  • .trellis/spec/guides/index.md
  • .trellis/tasks/00-bootstrap-guidelines/prd.md
  • .trellis/tasks/00-bootstrap-guidelines/task.json
  • .trellis/workflow.md
  • .trellis/workspace/YueMiyuki/index.md
  • .trellis/workspace/YueMiyuki/journal-1.md
  • .trellis/workspace/index.md
  • AGENTS.md
  • biome.json
  • package.json
  • scripts/android-env.mjs
  • scripts/android-gradle.properties
  • scripts/patch-android-gradle.mjs
  • scripts/sign-android-apks.mjs
  • src-tauri/Cargo.toml
  • src-tauri/capabilities/default.json
  • src-tauri/capabilities/mobile.json
  • src-tauri/risuko-cookies/src/browser/chromium.rs
  • src-tauri/risuko-cookies/src/browser/firefox.rs
  • src-tauri/risuko-cookies/src/browser/safari.rs
  • src-tauri/risuko-cookies/src/utils/paths.rs
  • src-tauri/risuko-engine/src/engine/gnutella/gwcache.rs
  • src-tauri/risuko-engine/src/engine/http.rs
  • src-tauri/risuko-engine/src/engine/manager.rs
  • src-tauri/risuko-engine/src/engine/rss/rule_engine.rs
  • src-tauri/risuko-share/Cargo.toml
  • src-tauri/risuko-share/src/lib.rs
  • src-tauri/src/commands/android_intent.rs
  • src-tauri/src/commands/file_cmds.rs
  • src-tauri/src/commands/mod.rs
  • src-tauri/src/commands/share_cmds.rs
  • src-tauri/src/lib.rs
  • src/renderer/components/Aside/Index.vue
  • src/renderer/components/Main.vue
  • src/renderer/components/Native/SelectDirectory.vue
  • src/renderer/components/Preference/Sync.vue
  • src/renderer/components/Share/Index.vue
  • src/renderer/pages/index/main.ts
  • src/renderer/router/index.ts
  • src/renderer/store/share.ts
  • src/renderer/store/sync.ts
  • src/renderer/styles/android.css
  • src/renderer/utils/native.ts
  • src/shared/locales/en-US/app.ts
  • src/shared/locales/en-US/index.ts
  • src/shared/locales/en-US/share.ts
  • src/shared/locales/zh-CN/app.ts
  • src/shared/locales/zh-CN/index.ts
  • src/shared/locales/zh-CN/share.ts
  • src/shared/locales/zh-TW/app.ts
  • src/shared/locales/zh-TW/index.ts
  • src/shared/locales/zh-TW/share.ts
  • src/shared/utils/index.ts

Comment on lines +179 to +185
- If it's a cross-platform issue → update `cross-platform-thinking-guide.md`
- If it's a cross-layer issue → update `cross-layer-thinking-guide.md`
- If it's a code reuse issue → update `code-reuse-thinking-guide.md`
- If it's domain-specific → update `backend/*.md` or `frontend/*.md`

2. **Sync templates** - After updating `.trellis/spec/`, sync to `src/templates/markdown/spec/`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for referenced thinking guides
find .trellis/spec/guides -name "*thinking-guide*" -type f 2>/dev/null | sort
ls -la .trellis/spec/guides/ 2>/dev/null || echo "Directory not found or empty"

Repository: YueMiyuki/Risuko

Length of output: 587


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Referenced guide filenames:\n'
rg -n --no-heading 'cross-platform-thinking-guide\.md|cross-layer-thinking-guide\.md|code-reuse-thinking-guide\.md' .agents/skills/trellis-break-loop/SKILL.md

printf '\nSearch for actual files in the repo:\n'
fd -a -t f 'cross-platform-thinking-guide.md' . || true
fd -a -t f 'cross-layer-thinking-guide.md' . || true
fd -a -t f 'code-reuse-thinking-guide.md' . || true

printf '\nGuide directory listing:\n'
find .trellis/spec/guides -maxdepth 1 -type f | sort

Repository: YueMiyuki/Risuko

Length of output: 615


Fix the missing guide reference
cross-platform-thinking-guide.md is not present in .trellis/spec/guides/; update the reference or add the file.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/trellis-break-loop/SKILL.md around lines 179 - 185, The guide
reference in the SKILL.md decision list points to
cross-platform-thinking-guide.md, but that file is missing from
.trellis/spec/guides/. Update the reference to the correct existing guide name
in the relevant section, or add the missing guide file if that is the intended
target, and keep the sync step to src/templates/markdown/spec/ aligned with the
change. Refer to the SKILL.md guide-selection rules and the sync templates
instruction when making the fix.

- If it's a code reuse issue → update `code-reuse-thinking-guide.md`
- If it's domain-specific → update `backend/*.md` or `frontend/*.md`

2. **Sync templates** - After updating `.trellis/spec/`, sync to `src/templates/markdown/spec/`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check template sync destination
test -d src/templates/markdown/spec && find src/templates/markdown/spec -type f | head -10 || echo "src/templates/markdown/spec/ NOT FOUND"

Repository: YueMiyuki/Risuko

Length of output: 193


Update the sync target path src/templates/markdown/spec/ doesn't exist in this repo, so the skill points at a dead destination. Point it at the actual template output directory or create the missing path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/trellis-break-loop/SKILL.md at line 184, The sync target path
referenced in the skill is incorrect because src/templates/markdown/spec/ does
not exist here. Update the “Sync templates” guidance to point to the actual
template output directory used by the project, or add the missing destination if
that is the intended target. Make sure the instruction in SKILL.md matches the
real path so the sync step references the correct location.

```

Behavior:
- Streams matching events as JSON, one per line.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove or correct the --tag flag reference.

Line 136 shows --tag interrupt in a wait example, but the tag-vs-kind section (lines 146-179) explicitly states there is no --tag flag anywhere in the v0.6.0 channel CLI. This contradicts the messages filter description at line 152 which also lists --tag. Verify whether --tag exists in wait and messages or remove these references to align with the authoritative tag-vs-kind documentation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/trellis-channel/references/command-reference.md at line 136,
The `wait` and `messages` examples in the command reference still mention a
`--tag` filter, but the authoritative tag-vs-kind section says that flag does
not exist in the v0.6.0 channel CLI. Update the documentation around the `wait`
and `messages` command descriptions to either remove `--tag` entirely or replace
it with the correct supported filter, and make sure the `wait`, `messages`, and
tag-vs-kind sections all use the same terminology.

```bash
trellis channel wait T --as main --from check --kind done --timeout 15m
trellis channel wait T --as main --from check,check-cx --kind done --all --timeout 15m
trellis channel wait T --as worker --tag interrupt --timeout 1h

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove --tag from wait example.

This example uses --tag interrupt, but command-reference.md explicitly states there is no --tag flag in the v0.6.0 channel CLI. Use --kind interrupt instead to align with the event kind model.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/trellis-channel/references/progress-debugging.md at line 136,
The `trellis channel wait` example in the progress debugging guide is using an
invalid `--tag` flag; update that example to use the event kind model instead.
Edit the `wait` command example so it matches the CLI documented by
`command-reference.md`, replacing `--tag interrupt` with `--kind interrupt` in
the `trellis channel wait` reference.

Comment on lines +149 to +153
Why subcommands first:

- `messages` already replays the file with filters (`--kind`, `--from`,
`--last`, `--tag`, `--thread`, `--action`) and gives you `--raw` for the
exact JSON. Anything you would write a one-liner for, `messages` already

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove --tag from messages filter description.

The messages filter list includes --tag, which contradicts the authoritative documentation in command-reference.md stating there is no --tag flag. Remove --tag from this list to maintain cross-file consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/trellis-channel/references/progress-debugging.md around lines
149 - 153, The messages filter description includes an unsupported --tag flag,
which conflicts with the authoritative command reference. Update the `messages`
section in `progress-debugging.md` to remove `--tag` from the listed filters and
keep only the flags that are actually documented elsewhere, preserving
consistency with `command-reference.md`.

Comment thread src-tauri/risuko-share/src/lib.rs Outdated
Comment thread src-tauri/risuko-share/src/lib.rs Outdated
Comment thread src-tauri/src/commands/android_intent.rs
Comment thread src/renderer/components/Share/Index.vue Outdated
Comment thread src/renderer/pages/index/main.ts Outdated
coderabbitai[bot]

This comment was marked as resolved.

@YueMiyuki
YueMiyuki merged commit 424c307 into master Jun 28, 2026
5 checks passed
@YueMiyuki YueMiyuki changed the title Next dev feat(share): add P2P encrypted file sharing Jun 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

next The "next" steps

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants